import Axios from 'axios'
import router from '../router/index'
import qs from 'qs'
import {
  Loading,
  Message
} from 'element-ui'
//创建一个axios对象
const instance = Axios.create({
  baseURL:'/api',//会在发送请求时候拼接在url参数前面
  timeout:5000,//请求5s超时
  withCredentials: true // 是否允许带cookie这些
})

//全局请求拦截
//表示所有的网络请求都会先走这个方法
//我们可以在它里面添加一些自定义的内容
// console.log('拦截器回调函数-拦截器被触发')
instance.interceptors.request.use(
  function (config) {
    console.group('全局请求拦截')
    console.log('拦截器回调函数-拦截器被触发')
    console.log(config)
    console.groupEnd()
    config.headers.token = '12345789'//例如可以在请求头里面设置token值，token变量名前后端约定
    if(config.url!=='login'){
      //需要授权的API 必须在请求头中使用 Authorization 字段 提供 token 令牌
      const AUTH_TOKEN = localStorage.getItem('token')
      config.headers.common['Authorization'] = AUTH_TOKEN
    }
    return config;
  },
  function (err) {
    return Promise.reject(err);
  },

)

//全局响应拦截
//表示所有网络请求返回数据之后都会先执行此方法
//此处可以根据服务器返回的状态码做相应的处理
//如根据请求状态码404/401/500等做相应的处理，页面跳转等
// response过滤器
Axios.interceptors.response.use(
  // 正确处理
  res => {
    let data = res.data;
    return data;
  },
  // 错误处理
  error => {
    let res = error.response;
    if (res) {
      switch (res.status) {
        //401 登录过期 返回登录
        case 401:
          Message.error({
            message: '登录过期，请重新登录'
          });
          router.replace({
            path: '/login?flag=true'
          })
          break;
      }
    } else {
      // console.log;
      Message.error({
        message: '网络错误，请刷新重试'
      });
    }
    return Promise.reject(error);
  }
);

// url传参
function urlParams (method, url, params) {
  return new Promise((resolve, reject) => {
    Axios({
      url,
      method,
      params,
      headers: {
        "Content-Type": "application/json;charset=UTF-8"
      }
    }).then(
      res => {
        resolve(res);
      },
      error => {
        reject(error)
      }
    )
      .catch((error) => {
        reject(error);
      })
  })
}

// body传参
function bodyParams (method, url, params, contentType) {
  return new Promise((resolve, reject) => {
    Axios({
      url,
      method,
      data: contentType == 'json' ? params : qs.stringify(params),
      headers: {
        "Content-Type": contentType == 'json' ? 'application/json;charset=UTF-8' : 'application/x-www-form-urlencoded;charset=UTF-8'
      }
    }).then(
      res => {
        resolve(res);
      },
      error => {
        reject(error)
      }
    ).catch((error) => {
      reject(error);
    })
  })
}

// body传参上传文件
function bodyParams1 (method, url, params) {
  return new Promise((resolve, reject) => {
    Axios({
      url,
      method,
      data: params,
      headers: {
        "Content-Type": 'multipart/form-data'
      }
    }).then(
      res => {
        resolve(res);
      },
      error => {
        reject(error)
      }
    ).catch((error) => {
      reject(error);
    })
  })
}

export function fetchGet (url, params = '') {
  return urlParams("get", url, params);
}

export function fetchDelete (url, params = '') {
  return urlParams("delete", url, params);
}

export function fetchPost (url, params, contentType) {
  return bodyParams("post", url, params, contentType);
}

export function fetchPut (url, params, contentType) {
  return bodyParams("put", url, params, contentType);
}

export function fetchPostFile (url, params, contentType) {
  return bodyParams1("post", url, params, contentType);
}

